/**
 * @file RecordFile.hpp
 * @brief 文件写入
 */

#ifndef RECORD_FILE_H
#define RECORD_FILE_H

#include "FileFormat/BaseFormat.hpp"
#include "ImageType.hpp"
#include "ThreadSafeQueue.hpp"
#include <thread>
#ifndef CLASS_RECORD_FILE_BUFFER_SIZE
#define CLASS_RECORD_FILE_BUFFER_SIZE 10
#endif

/**
 * @class RecordFile
 * @brief 提供一个线程队列，向指定的文件格式写入数据
 */
class RecordFile {
private:
  long FileSaveTime;
  long queueSize;
  std::jthread workthread;
  SafeQueue<ImageType> saveQueue;
  std::atomic_bool runflag = false;
  static const long QUEUE_MAXSIZE = CLASS_RECORD_FILE_BUFFER_SIZE;
  BaseFormat *format;

public:
  /**
   * @brief 开始写入数据
   *
   * @param saveFormat
   * @param savepath
   * @param BaseFormatAdditionalInf
   */
  void Start(BaseFormat *saveFormat, const std::filesystem::path &savepath,
             const BaseFormatAdditionalInf &BaseFormatAdditionalInf);
  /**
   * @brief 写入数据
   *
   * @param data
   */
  void operator<<(const ImageType data);
  /**
   * @brief 停止写入数据
   */
  void Stop();
  /**
   * @brief 工作状态
   *
   * @return `true`正在写入,'false'没有写入
   */
  bool Status();
  /**
   * @brief 析构函数
   */
  virtual ~RecordFile();
  /**
   * @brief 获取文件存储时间
   * @return 存储一张图片所用的时间（毫秒）
   */
  long GetFileSaveTime();
  /**
   * @brief 获取队列大小
   * @return 当前队列中图片的数量
   * @note 可以通过该数值分析是否存在IO瓶颈
   */
  long GetQueueSize();
};

#endif
